home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / util / cli / FileExtract.lha / FileExtract / FileExtract.c < prev   
C/C++ Source or Header  |  2002-06-01  |  5KB  |  178 lines

  1. /* FileExtract
  2.    By Marc Le Douarain
  3.    mavati@club-internet.fr
  4.    13 April 1999
  5.    Update:30 November 2001
  6.    Made on an idea of Mickaël Le Quer
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #define NO 0
  14. #define ODD 1
  15. #define EVEN 2
  16.  
  17. char Version[]="$VER:FileExtract 0.9 " __DATE__;
  18.  
  19. long HexaToLong(char *str)
  20. {
  21.     int i;
  22.     int pw;
  23.     int lgt;
  24.     static int car;
  25.     long res=0;
  26.     lgt=strlen(str);
  27.     pw=1;
  28.     for (i=lgt-1;i>=0;i--)
  29.     {
  30.         car=str[i];
  31.         if (car>='A')
  32.         {
  33.             if (car>='a')
  34.             {
  35.                 car=car-'a'+10;
  36.             }
  37.             else
  38.             {
  39.                 car=car-'A'+10;
  40.             }
  41.         }
  42.         else
  43.         {
  44.             car=car-'0';
  45.         }
  46.         res=res+(car*pw);
  47.         pw=pw*16;
  48.     }
  49.     return res;
  50. }
  51.  
  52. void main(int argc, char *argv[])
  53. {
  54.     char *FichierSrc;
  55.     char *FichierDest;
  56.     FILE *FSrc;
  57.     FILE *FDest;
  58.     char Octet,OctetUnused;
  59.     long i;
  60.     long StartPos;
  61.     long EndPos;
  62.     unsigned char NbrArgc;
  63.     char EnterlaceMode;
  64.     char Enterlaced;
  65.  
  66.     NbrArgc = (unsigned char)argc;
  67.     EnterlaceMode = NO;
  68.     Enterlaced = 0;
  69.     if (argc>1)
  70.     {
  71.         if (argv[1][0]=='-')
  72.         {
  73.             if (argv[1][1]=='o' || argv[1][1]=='O')
  74.                 EnterlaceMode = ODD;
  75.             if (argv[1][1]=='e' || argv[1][1]=='E')
  76.                 EnterlaceMode = EVEN;
  77.             NbrArgc--;
  78.             Enterlaced = 1;
  79.         }
  80.     }
  81.  
  82.     if ( (NbrArgc>3) && (strcmp(argv[1+Enterlaced],"?")!=0) )
  83.     {
  84.         FichierSrc=argv[1+Enterlaced];
  85.         FichierDest=argv[2+Enterlaced];
  86.         if (argv[3+Enterlaced][0]=='$')
  87.         {
  88.             StartPos=HexaToLong(&argv[3+Enterlaced][1]);
  89.         }
  90.         else
  91.         {
  92.             StartPos=atol(argv[3+Enterlaced]);
  93.         }
  94.         if (NbrArgc>4)
  95.         {
  96.             if (argv[4+Enterlaced][0]=='+')
  97.             {
  98.                 if (argv[4+Enterlaced][1]=='$')
  99.                 {
  100.                     EndPos=StartPos+HexaToLong(&argv[4+Enterlaced][2]);
  101.                 }
  102.                 else
  103.                 {
  104.                     EndPos=StartPos+atol(&argv[4+Enterlaced][1]);
  105.                 }
  106.             }
  107.             else
  108.             {
  109.                 if (argv[4+Enterlaced][0]=='$')
  110.                 {
  111.                     EndPos=HexaToLong(&argv[4+Enterlaced][1]);
  112.                 }
  113.                 else
  114.                 {
  115.                     EndPos=atol(argv[4+Enterlaced]);
  116.                 }
  117.             }
  118.         }
  119.         else
  120.         {
  121.             EndPos=-1;
  122.         }
  123.  
  124.         if ((EndPos!=-1)&&(EndPos<StartPos))
  125.         {
  126.             printf("Error: The EndOffset (%d) must be greater than the StartOffset (%d) !\n",StartPos,EndPos);
  127.             printf("If you use the fourth parameter as length : DO NOT FORGET the '+' behind the number!\n");
  128.         }
  129.         else
  130.         {
  131.             FSrc=fopen(FichierSrc,"rb");
  132.             if (FSrc)
  133.             {
  134.                 FDest=fopen(FichierDest,"wb");
  135.                 if (FDest)
  136.                 {
  137.                     fseek(FSrc, StartPos, SEEK_SET);
  138.                     for(i=StartPos;( ( ((i<=EndPos)&&(EndPos!=-1)) || (EndPos==-1) ) && (!(feof(FSrc))) );i++)
  139.                     {
  140.                         if (EnterlaceMode == EVEN)
  141.                         {
  142.                             fread(&OctetUnused,sizeof(char),1,FSrc);
  143.                             i++;
  144.                         }
  145.                         if (fread(&Octet,sizeof(char),1,FSrc))
  146.                         {
  147.                             if (EnterlaceMode == ODD)
  148.                             {
  149.                                 fread(&OctetUnused,sizeof(char),1,FSrc);
  150.                                 i++;
  151.                             }
  152.                             fwrite(&Octet,sizeof(char),1,FDest);
  153.                         }
  154.                     }
  155.                     fclose(FDest);
  156.                 }
  157.                 else
  158.                 {
  159.                     printf("Failed to write file:%s\n",FichierDest);
  160.                 }
  161.                 fclose(FSrc);
  162.             }
  163.             else
  164.             {
  165.                 printf("Failed to open file:%s\n",FichierSrc);
  166.             }
  167.         }
  168.     }
  169.     else
  170.     {
  171.         printf("%s By Marc Le Douarain (mavati@club-internet.fr)\n",Version+sizeof(char)*5);
  172.         printf("Usage: FileExtract [-mode] <SourceFile> <DestinationFile> <StartOffset> [<EndOffset>or<+Length>]\n"
  173.                "Numbers in hexadecimal usable with the first caracter '$'\n"
  174.                "-mode can be : -odd or -even\n");
  175.     }
  176. }
  177.  
  178.